home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
151-175
/
disk_166
/
stevie
/
source
/
fileio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
5KB
|
209 lines
/*
* STEVIE - Simply Try this Editor for VI Enthusiasts
*
* Code Contributions By : Tim Thompson twitch!tjt
* Tony Andrews onecom!wldrdg!tony
* G. R. (Fred) Walter watmath!watcgl!grwalter
*/
#include "stevie.h"
void
filemess(s)
char *s;
{
sprintf(IObuff, "\"%s\" %s", ((Filename == NULL) ? "" : Filename), s);
msg(IObuff);
}
void
renum()
{
LPTR *p;
unsigned int l = 0;
for (p = Filemem; p != NULL; p = nextline(p), l += LINEINC)
p->linep->num = l;
Fileend->linep->num = 0xffff;
}
#ifdef MEGAMAX
overlay "fileio"
#endif
bool_t
readfile(fname, fromp, nochangename)
char *fname;
LPTR *fromp;
bool_t nochangename; /* if TRUE, don't change the Filename */
{
FILE *f, *fopen();
LINE *curr;
char *p;
int i, c;
long nchars;
int unprint = 0;
int linecnt = 0;
bool_t wasempty = bufempty();
curr = fromp->linep;
if (!nochangename)
Filename = strsave(fname);
if ((f = fopen(fname, "r")) == NULL)
return TRUE;
filemess("");
i = 0;
for (nchars = 0; (c = getc(f)) != EOF; nchars++) {
if (c >= 0x80) {
c -= 0x80;
unprint++;
}
/*
* Nulls are special, so they can't show up in the file. We should
* count nulls seperate from other nasties, but this is okay for now.
*/
if (c == NUL) {
unprint++;
continue;
}
if (c == '\n') { /* process the completed line */
int len;
LINE *lp;
IObuff[i] = NUL;
len = strlen(IObuff) + 1;
if ((lp = newline(len)) == NULL) {
fprintf(stderr, "not enough memory - should never happen");
getout(1);
}
strcpy(lp->s, IObuff);
curr->next->prev = lp; /* new line to next one */
lp->next = curr->next;
curr->next = lp; /* new line to prior one */
lp->prev = curr;
curr = lp; /* new line becomes current */
i = 0;
linecnt++;
} else
IObuff[i++] = (char) c;
}
fclose(f);
/*
* If the buffer was empty when we started, we have to go back and remove
* the "dummy" line at Filemem and patch up the ptrs.
*/
if (wasempty) {
LINE *dummy = Filemem->linep; /* dummy line ptr */
free(dummy->s); /* free string space */
Filemem->linep = Filemem->linep->next;
free((char *) dummy); /* free LINE struct */
Filemem->linep->prev = NULL;
Curschar->linep = Filemem->linep;
Topchar->linep = Filemem->linep;
}
if (unprint > 0)
p = "\"%s\" %d lines, %ld characters (%d un-printable))";
else
p = "\"%s\" %d lines, %ld characters";
sprintf(IObuff, p, fname, linecnt, nchars, unprint);
msg(IObuff);
renum();
return FALSE;
}
/*
* writeit - write to file 'fname' lines 'start' through 'end'
*
* If either 'start' or 'end' contain null line pointers, the default is to use
* the start or end of the file respectively.
*/
bool_t
writeit(fname, start, end)
char *fname;
LPTR *start, *end;
{
FILE *f, *fopen();
FILE *fopenb(); /* open in binary mode, where needed */
char backup[16], *s;
long nchars;
int lines;
LPTR *p;
sprintf(IObuff, "\"%s\"", fname);
msg(IObuff);
/*
* Form the backup file name - change foo.* to foo.bak
*/
strcpy(backup, fname);
for (s = backup; *s && *s != '.'; s++);
*s = NUL;
strcat(backup, ".bak");
/*
* Delete any existing backup and move the current version to the backup.
* For safety, we don't remove the backup until the write has finished
* successfully. And if the 'backup' option is set, leave it around.
*/
rename(fname, backup);
f = P(P_CR) ? fopen(fname, "w") : fopenb(fname, "w");
if (f == NULL) {
emsg("Can't open file for writing!");
return FALSE;
}
/*
* If we were given a bound, start there. Otherwise just start at the
* beginning of the file.
*/
if (start == NULL || start->linep == NULL)
p = Filemem;
else
p = start;
lines = 0;
nchars = 0;
do {
fprintf(f, "%s\n", p->linep->s);
nchars += strlen(p->linep->s) + 1;
lines++;
/*
* If we were given an upper bound, and we just did that line, then
* bag it now.
*/
if (end != NULL && end->linep != NULL) {
if (end->linep == p->linep)
break;
}
} while ((p = nextline(p)) != NULL);
fclose(f);
sprintf(IObuff, "\"%s\" %d lines, %ld characters", fname, lines, nchars);
msg(IObuff);
UNCHANGED;
/*
* Remove the backup unless they want it left around
*/
if (!P(P_BK))
remove(backup);
return TRUE;
}